<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div></div>
  <script>
    // 模拟data
    const data = {
      msg: 'hello world',
      count: 1000,
      name: 'abc'
    }
    // 模拟vue实例
    const vm = {}
    Object.keys(data).forEach(key => {
      Object.defineProperty(vm, key, {
        // vm上面属性是否是可配置的 （可以删除了）
        configurable: true,
        // 是否可枚举（可以遍历）
        enumerable: true,
        // 当访问vm上面的属性的时候 会执行get
        get() {
          console.log('get执行了')
          return data[key]
        },
        // 当设置vm上面的属性的时候 会执行set
        set(newVal) {
          console.log('set执行了')
          if (newVal === data[key]) {
            return
          }
          data[key] = newVal
          document.querySelector('div').innerText = data[key]
        }
      })
    })

  </script>
</body>

</html>